/*
给定一个n*n的棋盘，棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后，
使任意的两个黑皇后都不在同一行、同一列或同一条对角线上，任意的两个白皇后都不在同一行、同一列或同一条对角线上。
问总共有多少种放法？n小于等于8。

样例输入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

样例输出
2

样例输入
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1

样例输出  
0
*/

#include<bits/stdc++.h>
using namespace std;
#define N 10
int tot=0,n;
int pos[N][N];
int b[N]={0};
int w[N]={0};
bool checkb(int x,int y){//第x行的皇后能否放在y列上
	//枚举从第一行开始的皇后与要安排的那一行的皇后是否发生冲突 
	for(int i=1;i<=x;i++){
		if(b[i]==y) return false;
		if(i+b[i]==x+y) return false;
		if(i-b[i]==x-y) return false;
	} 
	return true;
}
bool checkw(int x,int y){//第x行的皇后能否放在y列上
	//枚举从第一行开始的皇后与要安排的那一行的皇后是否发生冲突 
	for(int i=1;i<=x;i++){
		if(w[i]==y) return false;
		if(i+w[i]==x+y) return false;
		if(i-w[i]==x-y) return false;
	} 
	return true;
}

void dfs_white(int row){//表示第row行的皇后应放于何处 
	if(row==n+1){
		//产生了一组解
		tot++;
		return; 
	}
	//枚举每一列的皇后，共n列，判断某行的皇后能否放在该列上 
	for(int i=1;i<=n;i++){
		//check第row行的皇后能否放在i列上面 
		if(pos[row][i]==0) continue;
		if(b[row]==i) continue;
		if(checkw(row,i)){
			w[row]=i;
			dfs_white(row+1);
			w[row]=-1;
		}
	}
}
void dfs_black(int row){//表示第row行的皇后应放于何处 
	if(row==n+1){
		dfs_white(1);
	}
	//枚举每一列的皇后，共n列，判断某行的皇后能否放在该列上 
	for(int i=1;i<=n;i++){
		//check第row行的皇后能否放在i列上面 
		if(pos[row][i]==0) continue;
		if(checkb(row,i)){
			b[row]=i;
			dfs_black(row+1);
			b[row]=-1;
		}
	}
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>pos[i][j];
		}
	}
	dfs_black(1);
	cout<<tot<<endl;
	return 0;
}